package com.levi.juc.forkjoin;

import java.util.concurrent.RecursiveTask;

/**
 * 1.forkJoinpool  来执行
 * 2.forkJoinpool.execute(ForkJoinTask<?> task)来执行
 * 3.ForkJoinTask是一个抽象类，需要一个具体类来竭诚实现里面的方法    常用的有两个RecursiveAction ， RecursiveTask
 * 4.RecursiveAction   递归事件没有返回值，  RecursiveTask递归任务有返回值
 * 5.计算任务类要继承 forkjointask抽象类，实现里面的computer方法
 */
public class ForkJoinTest extends RecursiveTask<Long> {

    private Long start;
    private Long end;
    private Long temp = 10000L;
    //有参构造方法
    public ForkJoinTest(Long start, Long end) {
        this.start = start;
        this.end = end;
    }

    //实现计算方法computer，计算逻辑写在这个方法里面
    @Override
    protected Long compute() {
        if ((end - start) < temp) {
            //数据量小  普通方法计算
            Long sum = 0L;
            for (Long i = start; i <= end; i++) {
                sum += i;
            }
            return sum;
        } else {
            //数据量大使用forkjoin计算
            long middle = (end + start) / 2;
            //拆分任务，把任务压入队列
            ForkJoinTest task1 = new ForkJoinTest(start, middle);
            task1.fork();
            ForkJoinTest task2 = new ForkJoinTest(middle + 1, end);
            task2.fork();
            //拆分之后在合并,最后返回出去
            return task1.join() + task2.join();
        }

    }



}
